Load Packages
library(rvest)
library(tidyverse)
library(genius)
library(tidytext)
library(dplyr)
library(ggplot2)
library(qdap)
library(mosaic)
library(lubridate)
library(data.table)
library(gridExtra)
Data Access
# read webpage for Grammy Awards
webpage <- read_html("https://en.wikipedia.org/wiki/Grammy_Award_for_Record_of_the_Year")
# copy xpath for table of 1980 to 2019
XPATH1980 <- '/html/body/div[3]/div[3]/div[5]/div[1]/table[5]'
XPATH1990 <- '/html/body/div[3]/div[3]/div[5]/div[1]/table[6]'
XPATH2000 <- '/html/body/div[3]/div[3]/div[5]/div[1]/table[7]'
XPATH2010 <- '/html/body/div[3]/div[3]/div[5]/div[1]/table[8]'
# run the following to create table of songs from 1980 to 2019
# crate table of song in 1980s
table_1980 <-
webpage %>%
html_nodes(xpath = XPATH1980) %>%
html_table(fill = TRUE)
d1980 <- table_1980[[1]]
d1980
# crate table of songs in 1990s
table_1990 <-
webpage %>%
html_nodes(xpath = XPATH1990) %>%
html_table(fill = TRUE)
d1990 <- table_1990[[1]]
d1990
# crate table of songs in 2000s
table_2000 <-
webpage %>%
html_nodes(xpath = XPATH2000) %>%
html_table(fill = TRUE)
d2000 <- table_2000[[1]]
d2000
# crate table of songs in 2010s
table_2010 <-
webpage %>%
html_nodes(xpath = XPATH2010) %>%
html_table(fill = TRUE)
d2010 <- table_2010[[1]]
d2010
NA
Data Wrangling
# combine the lyrics in 1980s and 1990s
table_19801990 <-
d1980 %>%
full_join( d1990 )
Joining, by = c("Year[I]", "Record", "Artist(s)", "Production team")
table_19801990
# combine the songs in 1980s, 1990s and 2000s
table_198019902000 <-
table_19801990 %>%
full_join( d2000 )
Joining, by = c("Year[I]", "Record", "Artist(s)", "Production team")
table_198019902000
# combine the songs in 1980s, 1990s, 2000s and 2010s.
# delete NA
table1980to2010 <-
table_198019902000 %>%
full_join( d2010 ) %>%
na.omit()
Joining, by = c("Year[I]", "Record", "Artist(s)", "Production team")
table1980to2010
# delete the column of Production team
table1980to2010$`Production team` <- NULL
table1980to2010
# change the name of songs in 1980s to 2010s
names(table1980to2010) <- c("Year","track","artis")
table1980to2010
# delete the [] after each year
table1980to2010$Year <-
substr(table1980to2010$Year,1,4)
table1980to2010
NA
# add lyrics
# using genius package to run the add_genius() function
lyrics1980to2010 <- table1980to2010 %>%
add_genius(artis, track, type = "lyrics")
# see the stop_words that in tidytext package
stop_words <-
tidytext::stop_words
stop_words
# make the lyrics to the single words, because if we do not change the lyrics to the single words, I cannot filter out the stop words.
# Using tidytext package to run the unnest_tokens() function
verse_words <- lyrics1980to2010%>%
unnest_tokens(word, lyric)
verse_words
# filter out the words that in the tidytext package
ft <- verse_words %>%
anti_join(stop_words)
Joining, by = "word"
# filter out the other 11 stop words
ft1 <- ft %>%
filter(!word %in% c("ba", "du", "yeah", "da", "ya", "ooh", "gonna", "na", "uh", "la", "hol"))
ft1
Because we cannot filter out some certain words that in a whole lyrics, so we need to spread these lyrics and make them to a single word, which need to complete by unnest_tokens(word, lyric). After that, we need to filter stop words that in tidytext package, and we need to use anti_join(stop_words) to finish that. After filter the stop words that in the tidytext package, we need to filter another 11 stopwords, so we need to use the filter function and use the !, which means inverse, so the function that we need to use is filter(!word %in% c(“ba”, “du”, “yeah”, “da”, “ya”, “ooh”, “gonna”, “na”, “uh”, “la”, “hol”)). After doing these 3 steps, we are successfully filter all stop words from the lyrics.
Data Visualization
Graph 1
# Filter out the words that used in the lyrics between 1980 and 1989 years and then make a new column in order to make the words that used in the lyrics between 1980 and 1989 to 1980s, because 1980 to 1989 years all belong to 1980s
# Using dplyr package to run the filter() and mutate() function
lyrics1980s <-
verse_words %>%
filter(Year %in% (1980:1989)) %>%
mutate(decade = "1980s")
lyrics1980s
# Filter out the words that used in the lyrics between 1990 and 1999 years and then make a new column in order to make the words that used in the lyrics between 1990 and 1999 to 1990s, because 1990 to 1999 years all belong to 1990s
# Using dplyr package to run the filter() and mutate() function
lyrics1990s <-
verse_words %>%
filter(Year %in% (1990:1999)) %>%
mutate(decade = "1990s")
lyrics1990s
# Filter out the words that used in the lyrics between 2000 and 2009 years and then make a new column in order to make the words that used in the lyrics between 2000 and 2009 to 2000s, because 2000 to 2009 years all belong to 2000s
# Using dplyr package to run the filter() and mutate() function
lyrics2000s <-
verse_words %>%
filter(Year %in% (2000:2009)) %>%
mutate(decade = "2000s")
lyrics2000s
# Filter out the words that used in the lyrics between 2010 and 2019 years and then make a new column in order to make the words that used in the lyrics between 2010 and 2019 to 2010s, because 2010 to 2019 years all belong to 2010s
# Using dplyr package to run the filter() and mutate() function
lyrics2010s <-
verse_words %>%
filter(Year %in% (2010:2019)) %>%
mutate(decade = "2010s")
lyrics2010s
# join the lyrics that in 1980s and 1990s
# Using dplyr package to run the full_join() package
lyrics1980sto1990s <-
lyrics1980s %>%
full_join(lyrics1990s)
Joining, by = c("Year", "track", "artis", "track_title", "line", "word", "decade")
lyrics1980sto1990s
# make lyrics 1980s, 1990s and 2000s together
# Using dplyr package to run the full_join() package
lyrics1980sto2000s <-
lyrics1980sto1990s %>%
full_join(lyrics2000s)
Joining, by = c("Year", "track", "artis", "track_title", "line", "word", "decade")
lyrics1980sto2000s
# make lyrics that are in 1980s, 1990s, 2000s, 2010s together
# Using dplyr package to run the full_join() function
lyrics1980sto2010s <-
lyrics1980sto2000s %>%
full_join(lyrics2010s)
Joining, by = c("Year", "track", "artis", "track_title", "line", "word", "decade")
lyrics1980sto2010s
# group by the track and the decade, and count the n, which is the number of the words, and then we can know Words per Grammy Nominated Song by Decade
# Using dplyr package to run the group_by() function
lyrics1980sto2010s =
lyrics1980sto2010s %>%
group_by(track, decade) %>%
count %>%
ungroup
lyrics1980sto2010s %>% nrow
[1] 174
lyrics1980sto2010s
NA
# Using data in lyrics1980sto2010s to draw the graph that shows Words per Grammy Nominated Song by Decade
# Using ggplot package to run the ggplot() and geom_boxplot() function
lyrics1980sto2010s %>%
ggplot(aes(x = decade, y = n, fill = decade))+
geom_boxplot()+
labs(x = "Decade", y = "Words per Song", title = "Boxplots of Words per Grammy Nominated Song by Decade")

NA
From the first graph, we can know the words per song for each decade. In 1980s (1980-1989), the median of number of words per song is abut 300. In 1990s (1990-1999), the median of number of words per song is about 290. In 2000s (2000-2009), the median of number of words per song is about 375. In 2010s (2010-2019), the median of number of words per song is about 380. Therefore, by looking at the first graph, people can know how the words per song in each decade changed, and it is really interesting.
Graph 2
# count the words and use top_n(10) to know the ten most popular words of Grammy Nominated Songs from 1980 - 2019 (except all the stop words)
# Using mosaic package to run the count() function
# Using dplyr package to run the filter() and top_n() function
Graph2topten <- ft1 %>%
count(word, sort = TRUE) %>%
filter(n >= 3) %>%
#filter(word != 'em') %>% #Review topten and filter words missed by stop_words
top_n(10)
Selecting by n
Graph2topten
# Using the data in Graph2topten to draw the graph that show the ten most popular words of Grammy Nominated Songs from 1980 - 2019
# Using ggplot package to run the ggplot() and geom_col() function
Graph2topten %>%
ggplot(aes(x = reorder(word, -n), y = n)) +
geom_col(fill = "pink")+
labs(y = "Count", x = "Word", title = "Ten Most Popular Words of Grammy Nominated Songs from 1980 - 2019" )

For the second graph, we can know the ten most popular words of Grammy Nominated Songs from 1980 - 2019 (except stop words). It means that we can know which words are popular in Grammy Nominated Songs from 1980 - 2019. By looking the graph, we can know that the word “love” is the most popular words of Grammy Nominated Songs from 1980 - 2019, and it is used more than 500 times!
Graph 3
# Filter out the words that used in the lyrics between 1980 and 1989 years and then make a new column in order to make the words that used in the lyrics between 1980 and 1989 to 1980s, because 1980 to 1989 years all belong to 1980s (except stop words)
# Using dplyr package to run the filter() and mutate() function
newlyrics1980s <-
ft1 %>%
filter(Year %in% (1980:1989)) %>%
mutate(decade = "1980s")
newlyrics1980s
# Filter out the words that used in the lyrics between 1990 and 1999 years and then make a new column in order to make the words that used in the lyrics between 1990 and 1999 to 1990s, because 1990 to 1999 years all belong to 1990s (except all stop words)
# Using dplyr package to run the filter() and mutate() function
newlyrics1990s <-
ft1 %>%
filter(Year %in% (1990:1999)) %>%
mutate(decade = "1990s")
newlyrics1990s
# Filter out the words that used in the lyrics between 2000 and 2009 years and then make a new column in order to make the words that used in the lyrics between 2000 and 2009 to 2000s, because 2000 to 2009 years all belong to 2000s (except all stop words)
# Using dplyr package to run the filter() and mutate() function
newlyrics2000s <-
ft1 %>%
filter(Year %in% (2000:2009)) %>%
mutate(decade = "2000s")
newlyrics2000s
# Filter out the words that used in the lyrics between 2010 and 2019 years and then make a new column in order to make the words that used in the lyrics between 2010 and 2019 to 2010s, because 2010 to 2019 years all belong to 2010s (except all stop words)
# Using dplyr package to run the filter() and mutate() function
newlyrics2010s <-
ft1 %>%
filter(Year %in% (2010:2019)) %>%
mutate(decade = "2010s")
newlyrics2010s
# make words in lyrics that are in 1980s and 1990s together (except all stop words)
# Using dplyr package to run the full_join() function
newlyrics1980sto1990s <-
newlyrics1980s %>%
full_join(newlyrics1990s)
Joining, by = c("Year", "track", "artis", "track_title", "line", "word", "decade")
newlyrics1980sto1990s
# make words in lyrics that are in 1980s, 1990s and 2000s together (except all stop words)
# Using dplyr package to run the full_join() function
newlyrics1980sto2000s <-
newlyrics1980sto1990s %>%
full_join(newlyrics2000s)
Joining, by = c("Year", "track", "artis", "track_title", "line", "word", "decade")
newlyrics1980sto2000s
# make words in lyrics that are in 1980s, 1990s, 2000s and 2010s together (except all stop words)
# Using dplyr package to run the full_join() function
newlyrics1980sto2010s <-
newlyrics1980sto2000s %>%
full_join(newlyrics2010s)
Joining, by = c("Year", "track", "artis", "track_title", "line", "word", "decade")
newlyrics1980sto2010s
# know the top 10 words that used in 1980s
# Using mosaic package to run the count() function
# Using dplyr package to run the filter() and top_n() function
Graph3topten80s <- newlyrics1980s %>%
count(word, sort = TRUE) %>%
filter(n >= 3) %>%
#filter(word != 'em') %>% #Review topten and filter words missed by stop_words
top_n(10)
Selecting by n
Graph3topten80s
# know the top 10 words that used in 1990s (except all stop words)
# Using mosaic package to run the count() function
# Using dplyr package to run the filter() and top_n() function
Graph3topten90s <- newlyrics1990s %>%
count(word, sort = TRUE) %>%
filter(n >= 3) %>%
#filter(word != 'em') %>% #Review topten and filter words missed by stop_words
top_n(10)
Selecting by n
Graph3topten90s
# know the top 10 words that used in 2000s (except all stop words)
# Using mosaic package to run the count() function
# Using dplyr package to run the filter() and top_n() function
Graph3topten00s <- newlyrics2000s %>%
count(word, sort = TRUE) %>%
filter(n >= 3) %>%
#filter(word != 'em') %>% #Review topten and filter words missed by stop_words
top_n(10)
Selecting by n
Graph3topten00s
# know the top 10 words that used in 2010s (except all stop words)
# Using mosaic package to run the count() function
# Using dplyr package to run the filter() and top_n() function
Graph3topten10s <- newlyrics2010s %>%
count(word, sort = TRUE) %>%
filter(n >= 3) %>%
#filter(word != 'em') %>% #Review topten and filter words missed by stop_words
top_n(10)
Selecting by n
Graph3topten10s
# draw a graph that can show the top 10 words in 1980s
# Using ggplot package to run the ggplot() and geom_col() function
Graph3.1 <-
Graph3topten80s %>%
ggplot(aes(x = reorder(word, -n), y = n)) +
geom_col(fill = "Blue")+
labs(y = "Count", x = "Word", title = "1980s" )
# draw a graph that can show the top 10 words in 1990s
# Using ggplot package to run the ggplot() and geom_col() function
Graph3.2 <-
Graph3topten90s %>%
ggplot(aes(x = reorder(word, -n), y = n)) +
geom_col(fill = "pink")+
labs(y = "Count", x = "Word", title = "1990s" )
# draw a graph that can show the top 10 words in 2000s
# Using ggplot package to run the ggplot() and geom_col() function
Graph3.3 <-
Graph3topten00s %>%
ggplot(aes(x = reorder(word, -n), y = n)) +
geom_col(fill = "red")+
labs(y = "Count", x = "Word", title = "2000s" )
# draw a graph that can show the top 10 words in 2010s
# Using ggplot package to run the ggplot() and geom_col() function
Graph3.4 <-
Graph3topten10s %>%
ggplot(aes(x = reorder(word, -n), y = n)) +
geom_col(fill = "orange")+
labs(y = "Count", x = "Word", title = "2010s" )
# Combine the 4 graphs that created before, and combine then together by using grid.arrange() function, and then people can know the top ten words by secade (except stop words)
# Using grid.Extra package to run the grid.arrange() function
Graph3 <-
grid.arrange(Graph3.1, Graph3.2, Graph3.3, Graph3.4, top = "Top Ten Words by Decade")

For the third graph, we can know top ten words by decade. In 1980s (1980-1989), we can know the words “love” is the most popular words in the Grammy Nominated Songs from 1980-1989, and it has been used more than 150 times. From these four graphs, people can know that the word “love” is the most popular words in all 4 decades!
Graph 4
# crate a same data table but different name, because I affraid I got something run and need to run the code from the beginning
newlyrics1980sto2010sa <-
newlyrics1980sto2010s
# know the different sentiments based on the different words in the lyrics that in 1980s to 2010s
# Using dplyr package to run the inner_join() and mutate() function
# Using mosaic package to run the count() function
# Using tidyr package to run the spread() function
sentiment <-
newlyrics1980sto2010sa %>%
inner_join(get_sentiments("bing")) %>%
count(sentiment, word) %>%
spread(sentiment, n, fill = 0) %>%
mutate(polarity = positive - negative)
Joining, by = "word"
sentiment
# know the total words' sentiments in different year
# Using dplyr package to run the mutate() function
# Using mosaic package to run the count() function
# Using tidyr package to run the spread() function
bing <- get_sentiments("bing")
lyricssentiment <- newlyrics1980sto2010sa %>% inner_join(bing) %>%
count(Year, sentiment) %>%
spread(sentiment, n , fill=0) %>%
mutate(sentiment = positive - negative)
Joining, by = "word"
lyricssentiment
# filter out all the negative sentiment, and use positive sentiment
# Using dplyr package to run the filter() function
positive_senti <-
get_sentiments("bing") %>%
filter(sentiment == "positive")
positive_senti
# Know the total positive words' sentiment in different year
# Using dplyr package to run the semi_join() function
# Using mosaic package to run the count() function
lyricssentiment <-
newlyrics1980sto2010sa %>%
semi_join(positive_senti) %>%
count(Year, sort = TRUE)
Joining, by = "word"
lyricssentiment
# Crate a new table that only include the total positive sentiments in 1980 to 1989 and crate a new column called decade, because they all belong to 1980s
# Using dplyr package to run the filter() and mutate() function
senti80s <-
lyricssentiment %>%
filter(Year %in% (1980:1989)) %>%
mutate(decade = "1980s")
senti80s
# Crate a new table that only include the total positive sentiments in 1990 to 1999 and crate a new column called decade, because they all belong to 1990s
# Using dplyr package to run the filter() and mutate() function
senti90s <-
lyricssentiment %>%
filter(Year %in% (1990:1999)) %>%
mutate(decade = "1990s")
senti90s
# Crate a new table that only include the total positive sentiments in 2000 to 2009 and crate a new column called decade, because they all belong to 2000s
# Using dplyr package to run the filter() and mutate() function
senti00s <-
lyricssentiment %>%
filter(Year %in% (2000:2009)) %>%
mutate(decade = "2000s")
senti00s
# Crate a new table that only include the total positive sentiments in 2010 to 2019 and crate a new column called decade, because they all belong to 2010s
# Using dplyr package to run the filter() and mutate() function
senti10s <-
lyricssentiment %>%
filter(Year %in% (2010:2019)) %>%
mutate(decade = "2010s")
senti10s
# make 1980s and 1990s together
# Using dplyr package to run the full_join() function
senti8090 <-
senti80s %>%
full_join(senti90s)
Joining, by = c("Year", "n", "decade")
senti8090
# make 1980s, 1990s, and 2000s together
# Using dplyr package to run the full_join() function
senti809000 <-
senti8090 %>%
full_join(senti00s)
Joining, by = c("Year", "n", "decade")
senti809000
# make 1980s, 1990s, 2000s, and 2010s together
# Using dplyr package to run the full_join() function
lyricssentiment <-
senti809000 %>%
full_join(senti10s)
Joining, by = c("Year", "n", "decade")
lyricssentiment
# Filter out the words that used in the lyrics between 1980 and 1989 years and then make a new column in order to make the words that used in the lyrics between 1980 and 1989 to 1980s, because 1980 to 1989 years all belong to 1980s
# Using dplyr package to run the filter() and mutate() function
newlyrics1980snew <- ft1 %>%
filter(Year %in% (1980:1989)) %>%
mutate(decade = "1980s")
newlyrics1980snew
# Filter out the words that used in the lyrics between 1990 and 1999 years and then make a new column in order to make the words that used in the lyrics between 1990 and 1999 to 1990s, because 1980 to 1989 years all belong to 1990s
# Using dplyr package to run the filter() and mutate() function
newlyrics1990snew <- ft1 %>%
filter(Year %in% (1990:1999)) %>%
mutate(decade = "1990s")
newlyrics1990snew
# Filter out the words that used in the lyrics between 2000 and 2009 years and then make a new column in order to make the words that used in the lyrics between 2000 and 2009 to 2000s, because 1980 to 1989 years all belong to 2000s
# Using dplyr package to run the filter() and mutate() function
newlyrics2000snew <- ft1 %>%
filter(Year %in% (2000:2009)) %>%
mutate(decade = "2000s")
newlyrics2000snew
# Filter out the words that used in the lyrics between 2010 and 2019 years and then make a new column in order to make the words that used in the lyrics between 2000 and 2019 to 2010s, because 1980 to 1989 years all belong to 2010s
# Using dplyr package to run the filter() and mutate() function
newlyrics2010snew <- ft1 %>%
filter(Year %in% (2010:2019)) %>%
mutate(decade = "2010s")
newlyrics2010snew
# make words in lyrics that are in 1980s and 1990s together (except all stop words)
# Using dplyr package to run the full_join() function
newlyrics80sto90snew <- newlyrics1980snew %>%
full_join(newlyrics1990snew)
Joining, by = c("Year", "track", "artis", "track_title", "line", "word", "decade")
newlyrics80sto90snew
# make words in lyrics that are in 1980s, 1990s and 2000s together (except all stop words)
# Using dplyr package to run the full_join() function
newlyrics80sto00snew <- newlyrics80sto90snew %>%
full_join(newlyrics2000snew)
Joining, by = c("Year", "track", "artis", "track_title", "line", "word", "decade")
newlyrics80sto00snew
# make words in lyrics that are in 1980s, 1990s, 2000s and 2010s together (except all stop words)
# Using dplyr package to run the full_join() function
newlyrics80sto10snew <- newlyrics80sto00snew %>%
full_join(newlyrics2010snew)
Joining, by = c("Year", "track", "artis", "track_title", "line", "word", "decade")
newlyrics80sto10snew
# join the last table with the sentiment
# Using dplyr package to run the full_join() function
ft1sentiment <- newlyrics80sto10snew %>%
full_join(sentiments)
Joining, by = "word"
ft1sentiment
# make the sentiment that is negative to 0 and positive to 1
ft1sentiment_new <-
within(ft1sentiment_new, sentiment <- factor(sentiment, labels = c(0,1))) %>%
na.omit()
ft1sentiment_new
# filter out all the 0 (negative sentiment), and use all the 1 (positive sentiment)
# Using dplyr package to run the filter() function
ft1sentiment_new_net <-
ft1sentiment_new %>%
filter(sentiment == "1")
ft1sentiment_new_net
# Draw a graph that shows Net Sentiment Score by Year
# Using ggplot package to run the ggplot(), geom_bar() and theme() function
ggplot(ft1sentiment_new_net) +
aes(x = Year, fill = decade) +
geom_bar() +
labs(x = "Year", y = "Net Sentiment", title = "Net Sentiment Score by Year") +
theme(axis.text = element_text(angle = 30))

From fourth graph, we can know the net sentiment score by year. By looking the graph, we can know that between 1980 and 2019, lyrics in 2016 has the highest net sentiment score, and the net sentiment score is more than 100, and lyrics in 2011 has the lowest net sentiment score, and the net sentiment score is nearly 5.
Graph 5
# calculate the mean of the sentiment in 1980s
# Using mosaic package to run the mean() function
mean(senti80s$n)
[1] 49.1
# calculate the mean of the sentiment in 1990s
# Using mosaic package to run the mean() function
mean(senti90s$n)
[1] 35
# calculate the mean of the sentiment in 2000s
# Using mosaic package to run the mean() function
mean(senti00s$n)
[1] 34.1
# calculate the mean of the sentiment in 2010s
# Using mosaic package to run the mean() function
mean(senti10s$n)
[1] 41.5
# create a new data frame that include the mean of the sentiment in different decade
Meansenti <-
data.frame (first_column = c("1980s", "1990s", "2000s", "2010s") ,second_column = c("49.1", "35", "34.1", "41.5"))
names(Meansenti) <- c("decade","mean")
Meansenti
# Draw a graph that can show the Mean Sentiment Score by Decade
# Using ggplot package to run the ggplot(), geom_col() function
ggplot(Meansenti, aes(decade, mean, fill = decade)) +
geom_col() +
labs(y = "Mean Sentiment Score", x = "Decade", title = "Mean Sentiment Score by Decade" )

From the fifth graph, we can know the mean sentiment score by decade. By looking the graph, we can know that between 1980s and 2010s, the lyrics in 1980s has the highest mean sentiment score, and the lyrics in 2000s has the lowest mean sentiment score, their difference are really big, and about 15.
Graph 6
plot(lyricssentiment$Year, lyricssentiment$n, main = "Net Sentiment Score by Year of Grammy Nominated Records from 1980 - 2019 with Linear Model Fit", ylab = "Net Sentiment", xlab = "Year")

# draw a graph that can show Net Sentiment Score by Year of Grammy Nominated Records from 1980 - 2019 with Linear Model Fit
# Using ggplot package to run the ggplot(), ggtitle(), geom_smooth(), xlab() and ylab() function
ggplot(lyricssentiment, aes(x = Year, y = n, color = decade)) + geom_point() + geom_smooth() +
ggtitle("Net Sentiment Score by Year of Grammy Nominated Records from 1980 - 2019 with Linear Model Fit") +
xlab("Year") +
ylab("Net Sentiment") +
geom_smooth(aes(x = Year, y = n), method = "lm", se = FALSE, inherit.aes = FALSE, colour = "black", size = 1)

From the sixth graph, we can know the net sentiment score by year of Grammy Nominated Records from 1980 - 2019. By looking the graph, we can easily to know how the net sentiment change in different years, and by looking the fit line, we can know that the net sentiment has become higher from 2010s.
LS0tCnRpdGxlOiAiRmluYWwgUHJvamVjdCIKb3V0cHV0OiBodG1sX25vdGVib29rCmRhdGU6ICIxMi8xNC8yMDIwIgphdXRob3I6ICJUaW5neXUgUWlhbiIKLS0tCgojIyMgTG9hZCBQYWNrYWdlcwpgYGB7cn0KbGlicmFyeShydmVzdCkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZ2VuaXVzKQpsaWJyYXJ5KHRpZHl0ZXh0KQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkocWRhcCkKbGlicmFyeShtb3NhaWMpCmxpYnJhcnkobHVicmlkYXRlKQpsaWJyYXJ5KGRhdGEudGFibGUpCmxpYnJhcnkoZ3JpZEV4dHJhKQpgYGAKCiMjIyBEYXRhIEFjY2VzcwpgYGB7cn0KIyByZWFkIHdlYnBhZ2UgZm9yIEdyYW1teSBBd2FyZHMKd2VicGFnZSA8LSByZWFkX2h0bWwoImh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0dyYW1teV9Bd2FyZF9mb3JfUmVjb3JkX29mX3RoZV9ZZWFyIikKCiMgY29weSB4cGF0aCBmb3IgdGFibGUgb2YgMTk4MCB0byAyMDE5ClhQQVRIMTk4MCA8LSAnL2h0bWwvYm9keS9kaXZbM10vZGl2WzNdL2Rpdls1XS9kaXZbMV0vdGFibGVbNV0nClhQQVRIMTk5MCA8LSAnL2h0bWwvYm9keS9kaXZbM10vZGl2WzNdL2Rpdls1XS9kaXZbMV0vdGFibGVbNl0nClhQQVRIMjAwMCA8LSAnL2h0bWwvYm9keS9kaXZbM10vZGl2WzNdL2Rpdls1XS9kaXZbMV0vdGFibGVbN10nClhQQVRIMjAxMCA8LSAnL2h0bWwvYm9keS9kaXZbM10vZGl2WzNdL2Rpdls1XS9kaXZbMV0vdGFibGVbOF0nCgojIHJ1biB0aGUgZm9sbG93aW5nIHRvIGNyZWF0ZSB0YWJsZSBvZiBzb25ncyBmcm9tIDE5ODAgdG8gMjAxOQojIGNyYXRlIHRhYmxlIG9mIHNvbmcgaW4gMTk4MHMKdGFibGVfMTk4MCA8LSAKICB3ZWJwYWdlICU+JQogIGh0bWxfbm9kZXMoeHBhdGggPSBYUEFUSDE5ODApICU+JQogIGh0bWxfdGFibGUoZmlsbCA9IFRSVUUpCmQxOTgwIDwtIHRhYmxlXzE5ODBbWzFdXQpkMTk4MAoKIyBjcmF0ZSB0YWJsZSBvZiBzb25ncyBpbiAxOTkwcwp0YWJsZV8xOTkwIDwtIAogIHdlYnBhZ2UgJT4lCiAgaHRtbF9ub2Rlcyh4cGF0aCA9IFhQQVRIMTk5MCkgJT4lCiAgaHRtbF90YWJsZShmaWxsID0gVFJVRSkKZDE5OTAgPC0gdGFibGVfMTk5MFtbMV1dCmQxOTkwCgojIGNyYXRlIHRhYmxlIG9mIHNvbmdzIGluIDIwMDBzCnRhYmxlXzIwMDAgPC0gCiAgd2VicGFnZSAlPiUKICBodG1sX25vZGVzKHhwYXRoID0gWFBBVEgyMDAwKSAlPiUKICBodG1sX3RhYmxlKGZpbGwgPSBUUlVFKQpkMjAwMCA8LSB0YWJsZV8yMDAwW1sxXV0KZDIwMDAKCiMgY3JhdGUgdGFibGUgb2Ygc29uZ3MgaW4gMjAxMHMKdGFibGVfMjAxMCA8LSAKICB3ZWJwYWdlICU+JQogIGh0bWxfbm9kZXMoeHBhdGggPSBYUEFUSDIwMTApICU+JQogIGh0bWxfdGFibGUoZmlsbCA9IFRSVUUpCmQyMDEwIDwtIHRhYmxlXzIwMTBbWzFdXQpkMjAxMAoKYGBgCgojIyMgRGF0YSBXcmFuZ2xpbmcKCmBgYHtyfQojIGNvbWJpbmUgdGhlIHNvbmdzIGluIDE5ODBzIGFuZCAxOTkwcwojIHVzaW5nIGRwbHlyIHBhY2thZ2UgdG8gcnVuIHRoZSBmdW5jdGlvbiBmdWxsX2pvaW4oKQp0YWJsZV8xOTgwMTk5MCA8LSAKICBkMTk4MCAlPiUKICBmdWxsX2pvaW4oIGQxOTkwICkKdGFibGVfMTk4MDE5OTAKYGBgCgpgYGB7cn0KIyBjb21iaW5lIHRoZSBzb25ncyBpbiAxOTgwcywgMTk5MHMgYW5kIDIwMDBzCiMgdXNpbmcgZHBseXIgcGFja2FnZSB0byBydW4gdGhlIGZ1bmN0aW9uIGZ1bGxfam9pbigpCnRhYmxlXzE5ODAxOTkwMjAwMCA8LSAKICB0YWJsZV8xOTgwMTk5MCAlPiUKICBmdWxsX2pvaW4oIGQyMDAwICkKdGFibGVfMTk4MDE5OTAyMDAwCmBgYAoKYGBge3J9CiMgY29tYmluZSB0aGUgc29uZ3MgaW4gMTk4MHMsIDE5OTBzLCAyMDAwcyBhbmQgMjAxMHMuCiMgZGVsZXRlIE5BCiMgdXNpbmcgZHBseXIgcGFja2FnZSB0byBydW4gdGhlIGZ1bmN0aW9uIGZ1bGxfam9pbigpCnRhYmxlMTk4MHRvMjAxMCA8LSAKICB0YWJsZV8xOTgwMTk5MDIwMDAgJT4lCiAgZnVsbF9qb2luKCBkMjAxMCApICU+JQogIG5hLm9taXQoKSAKdGFibGUxOTgwdG8yMDEwCmBgYAoKYGBge3J9CiMgZGVsZXRlIHRoZSBjb2x1bW4gb2YgUHJvZHVjdGlvbiB0ZWFtCnRhYmxlMTk4MHRvMjAxMCRgUHJvZHVjdGlvbiB0ZWFtYCA8LSBOVUxMIAp0YWJsZTE5ODB0bzIwMTAKYGBgCgpgYGB7cn0KIyBjaGFuZ2UgdGhlIG5hbWUgb2Ygc29uZ3MgaW4gMTk4MHMgdG8gMjAxMHMKbmFtZXModGFibGUxOTgwdG8yMDEwKSA8LSBjKCJZZWFyIiwidHJhY2siLCJhcnRpcyIpIAp0YWJsZTE5ODB0bzIwMTAKYGBgCgpgYGB7cn0KIyBkZWxldGUgdGhlIFtdIGFmdGVyIGVhY2ggeWVhcgp0YWJsZTE5ODB0bzIwMTAkWWVhciA8LSAKICBzdWJzdHIodGFibGUxOTgwdG8yMDEwJFllYXIsMSw0KSAKdGFibGUxOTgwdG8yMDEwCiAgCmBgYAoKYGBge3J9CiMgYWRkIGx5cmljcyAKIyB1c2luZyBnZW5pdXMgcGFja2FnZSB0byBydW4gdGhlIGFkZF9nZW5pdXMoKSBmdW5jdGlvbgpseXJpY3MxOTgwdG8yMDEwIDwtIHRhYmxlMTk4MHRvMjAxMCAlPiUKICBhZGRfZ2VuaXVzKGFydGlzLCB0cmFjaywgdHlwZSA9ICJseXJpY3MiKQpgYGAKCmBgYHtyfQojIHNlZSB0aGUgc3RvcF93b3JkcyB0aGF0IGluIHRpZHl0ZXh0IHBhY2thZ2UKIyB1c2luZyB0aWR5dGV4dCBwYWNrYWdlIHRvIGtub3cgdGhlIHN0b3B3b3JkcwpzdG9wX3dvcmRzIDwtCiAgdGlkeXRleHQ6OnN0b3Bfd29yZHMKc3RvcF93b3JkcwpgYGAKCgpgYGB7cn0KIyBtYWtlIHRoZSBseXJpY3MgdG8gdGhlIHNpbmdsZSB3b3JkcywgYmVjYXVzZSBpZiB3ZSBkbyBub3QgY2hhbmdlIHRoZSBseXJpY3MgdG8gdGhlIHNpbmdsZSB3b3JkcywgSSBjYW5ub3QgZmlsdGVyIG91dCB0aGUgc3RvcCB3b3Jkcy4KIyBVc2luZyB0aWR5dGV4dCBwYWNrYWdlIHRvIHJ1biB0aGUgdW5uZXN0X3Rva2VucygpIGZ1bmN0aW9uCnZlcnNlX3dvcmRzIDwtIGx5cmljczE5ODB0bzIwMTAlPiUKICB1bm5lc3RfdG9rZW5zKHdvcmQsIGx5cmljKQp2ZXJzZV93b3JkcwpgYGAKCmBgYHtyfQojIGZpbHRlciBvdXQgdGhlIHdvcmRzIHRoYXQgaW4gdGhlIHRpZHl0ZXh0IHBhY2thZ2UKIyBVc2luZyBkcGx5ciBwYWNrYWdlIHRvIHJ1biB0aGUgYW50aV9qb2luKCkgZnVuY3Rpb24KZnQgPC0gdmVyc2Vfd29yZHMgJT4lCiAgYW50aV9qb2luKHN0b3Bfd29yZHMpCgojIGZpbHRlciBvdXQgdGhlIG90aGVyIDExIHN0b3Agd29yZHMKIyBVc2luZyBkcGx5ciBwYWNrYWdlIHRvIHJ1biB0aGUgZmlsdGVyKCkgZnVuY3Rpb24KZnQxIDwtIGZ0ICU+JQogIGZpbHRlcighd29yZCAlaW4lIGMoImJhIiwgImR1IiwgInllYWgiLCAiZGEiLCAieWEiLCAib29oIiwgImdvbm5hIiwgIm5hIiwgInVoIiwgImxhIiwgImhvbCIpKQpmdDEKYGBgCkJlY2F1c2Ugd2UgY2Fubm90IGZpbHRlciBvdXQgc29tZSBjZXJ0YWluIHdvcmRzIHRoYXQgaW4gYSB3aG9sZSBseXJpY3MsIHNvIHdlIG5lZWQgdG8gc3ByZWFkIHRoZXNlIGx5cmljcyBhbmQgbWFrZSB0aGVtIHRvIGEgc2luZ2xlIHdvcmQsIHdoaWNoIG5lZWQgdG8gY29tcGxldGUgYnkgdW5uZXN0X3Rva2Vucyh3b3JkLCBseXJpYykuIEFmdGVyIHRoYXQsIHdlIG5lZWQgdG8gZmlsdGVyIHN0b3Agd29yZHMgdGhhdCBpbiB0aWR5dGV4dCBwYWNrYWdlLCBhbmQgd2UgbmVlZCB0byB1c2UgYW50aV9qb2luKHN0b3Bfd29yZHMpIHRvIGZpbmlzaCB0aGF0LiBBZnRlciBmaWx0ZXIgdGhlIHN0b3Agd29yZHMgdGhhdCBpbiB0aGUgdGlkeXRleHQgcGFja2FnZSwgd2UgbmVlZCB0byBmaWx0ZXIgYW5vdGhlciAxMSBzdG9wd29yZHMsIHNvIHdlIG5lZWQgdG8gdXNlIHRoZSBmaWx0ZXIgZnVuY3Rpb24gYW5kIHVzZSB0aGUgISwgd2hpY2ggbWVhbnMgaW52ZXJzZSwgc28gdGhlIGZ1bmN0aW9uIHRoYXQgd2UgbmVlZCB0byB1c2UgaXMgZmlsdGVyKCF3b3JkICVpbiUgYygiYmEiLCAiZHUiLCAieWVhaCIsICJkYSIsICJ5YSIsICJvb2giLCAiZ29ubmEiLCAibmEiLCAidWgiLCAibGEiLCAiaG9sIikpLiBBZnRlciBkb2luZyB0aGVzZSAzIHN0ZXBzLCB3ZSBhcmUgc3VjY2Vzc2Z1bGx5IGZpbHRlciBhbGwgc3RvcCB3b3JkcyBmcm9tIHRoZSBseXJpY3MuCgojIyMgRGF0YSBWaXN1YWxpemF0aW9uCgojIyMgR3JhcGggMQoKYGBge3J9CiMgRmlsdGVyIG91dCB0aGUgd29yZHMgdGhhdCB1c2VkIGluIHRoZSBseXJpY3MgYmV0d2VlbiAxOTgwIGFuZCAxOTg5IHllYXJzIGFuZCB0aGVuIG1ha2UgYSBuZXcgY29sdW1uIGluIG9yZGVyIHRvIG1ha2UgdGhlIHdvcmRzIHRoYXQgdXNlZCBpbiB0aGUgbHlyaWNzIGJldHdlZW4gMTk4MCBhbmQgMTk4OSB0byAxOTgwcywgYmVjYXVzZSAxOTgwIHRvIDE5ODkgeWVhcnMgYWxsIGJlbG9uZyB0byAxOTgwcwojIFVzaW5nIGRwbHlyIHBhY2thZ2UgdG8gcnVuIHRoZSBmaWx0ZXIoKSBhbmQgbXV0YXRlKCkgZnVuY3Rpb24KbHlyaWNzMTk4MHMgPC0KICB2ZXJzZV93b3JkcyAlPiUKICBmaWx0ZXIoWWVhciAlaW4lICgxOTgwOjE5ODkpKSAlPiUKICBtdXRhdGUoZGVjYWRlID0gIjE5ODBzIikKbHlyaWNzMTk4MHMKYGBgCgpgYGB7cn0KIyBGaWx0ZXIgb3V0IHRoZSB3b3JkcyB0aGF0IHVzZWQgaW4gdGhlIGx5cmljcyBiZXR3ZWVuIDE5OTAgYW5kIDE5OTkgeWVhcnMgYW5kIHRoZW4gbWFrZSBhIG5ldyBjb2x1bW4gaW4gb3JkZXIgdG8gbWFrZSB0aGUgd29yZHMgdGhhdCB1c2VkIGluIHRoZSBseXJpY3MgYmV0d2VlbiAxOTkwIGFuZCAxOTk5IHRvIDE5OTBzLCBiZWNhdXNlIDE5OTAgdG8gMTk5OSB5ZWFycyBhbGwgYmVsb25nIHRvIDE5OTBzCiMgVXNpbmcgZHBseXIgcGFja2FnZSB0byBydW4gdGhlIGZpbHRlcigpIGFuZCBtdXRhdGUoKSBmdW5jdGlvbgpseXJpY3MxOTkwcyA8LQogIHZlcnNlX3dvcmRzICU+JQogIGZpbHRlcihZZWFyICVpbiUgKDE5OTA6MTk5OSkpICU+JQogIG11dGF0ZShkZWNhZGUgPSAiMTk5MHMiKQpseXJpY3MxOTkwcwpgYGAKCmBgYHtyfQojIEZpbHRlciBvdXQgdGhlIHdvcmRzIHRoYXQgdXNlZCBpbiB0aGUgbHlyaWNzIGJldHdlZW4gMjAwMCBhbmQgMjAwOSB5ZWFycyBhbmQgdGhlbiBtYWtlIGEgbmV3IGNvbHVtbiBpbiBvcmRlciB0byBtYWtlIHRoZSB3b3JkcyB0aGF0IHVzZWQgaW4gdGhlIGx5cmljcyBiZXR3ZWVuIDIwMDAgYW5kIDIwMDkgdG8gMjAwMHMsIGJlY2F1c2UgMjAwMCB0byAyMDA5IHllYXJzIGFsbCBiZWxvbmcgdG8gMjAwMHMKIyBVc2luZyBkcGx5ciBwYWNrYWdlIHRvIHJ1biB0aGUgZmlsdGVyKCkgYW5kIG11dGF0ZSgpIGZ1bmN0aW9uCmx5cmljczIwMDBzIDwtCiAgdmVyc2Vfd29yZHMgJT4lCiAgZmlsdGVyKFllYXIgJWluJSAoMjAwMDoyMDA5KSkgJT4lCiAgbXV0YXRlKGRlY2FkZSA9ICIyMDAwcyIpCmx5cmljczIwMDBzCmBgYAoKYGBge3J9CiMgRmlsdGVyIG91dCB0aGUgd29yZHMgdGhhdCB1c2VkIGluIHRoZSBseXJpY3MgYmV0d2VlbiAyMDEwIGFuZCAyMDE5IHllYXJzIGFuZCB0aGVuIG1ha2UgYSBuZXcgY29sdW1uIGluIG9yZGVyIHRvIG1ha2UgdGhlIHdvcmRzIHRoYXQgdXNlZCBpbiB0aGUgbHlyaWNzIGJldHdlZW4gMjAxMCBhbmQgMjAxOSB0byAyMDEwcywgYmVjYXVzZSAyMDEwIHRvIDIwMTkgeWVhcnMgYWxsIGJlbG9uZyB0byAyMDEwcwojIFVzaW5nIGRwbHlyIHBhY2thZ2UgdG8gcnVuIHRoZSBmaWx0ZXIoKSBhbmQgbXV0YXRlKCkgZnVuY3Rpb24KbHlyaWNzMjAxMHMgPC0KICB2ZXJzZV93b3JkcyAlPiUKICBmaWx0ZXIoWWVhciAlaW4lICgyMDEwOjIwMTkpKSAlPiUKICBtdXRhdGUoZGVjYWRlID0gIjIwMTBzIikKbHlyaWNzMjAxMHMKYGBgCgpgYGB7cn0KIyBqb2luIHRoZSBseXJpY3MgdGhhdCBhcmUgaW4gMTk4MHMgYW5kIDE5OTBzCiMgVXNpbmcgZHBseXIgcGFja2FnZSB0byBydW4gdGhlIGZ1bGxfam9pbigpIGZ1bmN0aW9uCmx5cmljczE5ODBzdG8xOTkwcyA8LQogIGx5cmljczE5ODBzICU+JQogIGZ1bGxfam9pbihseXJpY3MxOTkwcykKbHlyaWNzMTk4MHN0bzE5OTBzCmBgYAoKYGBge3J9CiMgbWFrZSBseXJpY3MgdGhhdCBhcmUgaW4gMTk4MHMsIDE5OTBzIGFuZCAyMDAwcyB0b2dldGhlcgojIFVzaW5nIGRwbHlyIHBhY2thZ2UgdG8gcnVuIHRoZSBmdWxsX2pvaW4oKSBmdW5jdGlvbgpseXJpY3MxOTgwc3RvMjAwMHMgPC0KICBseXJpY3MxOTgwc3RvMTk5MHMgJT4lCiAgZnVsbF9qb2luKGx5cmljczIwMDBzKQpseXJpY3MxOTgwc3RvMjAwMHMKYGBgCgpgYGB7cn0KIyBtYWtlIGx5cmljcyB0aGF0IGFyZSBpbiAxOTgwcywgMTk5MHMsIDIwMDBzLCAyMDEwcyB0b2dldGhlcgojIFVzaW5nIGRwbHlyIHBhY2thZ2UgdG8gcnVuIHRoZSBmdWxsX2pvaW4oKSBmdW5jdGlvbgpseXJpY3MxOTgwc3RvMjAxMHMgPC0KICBseXJpY3MxOTgwc3RvMjAwMHMgJT4lCiAgZnVsbF9qb2luKGx5cmljczIwMTBzKQpseXJpY3MxOTgwc3RvMjAxMHMKYGBgCgoKYGBge3J9CiMgZ3JvdXAgYnkgdGhlIHRyYWNrIGFuZCB0aGUgZGVjYWRlLCBhbmQgY291bnQgdGhlIG4sIHdoaWNoIGlzIHRoZSBudW1iZXIgb2YgdGhlIHdvcmRzLCBhbmQgdGhlbiB3ZSBjYW4ga25vdyBXb3JkcyBwZXIgR3JhbW15IE5vbWluYXRlZCBTb25nIGJ5IERlY2FkZQojIFVzaW5nIGRwbHlyIHBhY2thZ2UgdG8gcnVuIHRoZSBncm91cF9ieSgpIGZ1bmN0aW9uCmx5cmljczE5ODBzdG8yMDEwcyA9CiAgbHlyaWNzMTk4MHN0bzIwMTBzICU+JQogIGdyb3VwX2J5KHRyYWNrLCBkZWNhZGUpICU+JQogIGNvdW50ICU+JQogIHVuZ3JvdXAKCmx5cmljczE5ODBzdG8yMDEwcyAlPiUgbnJvdwoKbHlyaWNzMTk4MHN0bzIwMTBzCgpgYGAKCgpgYGB7cn0KIyBVc2luZyBkYXRhIGluIGx5cmljczE5ODBzdG8yMDEwcyB0byBkcmF3IHRoZSBncmFwaCB0aGF0IHNob3dzIFdvcmRzIHBlciBHcmFtbXkgTm9taW5hdGVkIFNvbmcgYnkgRGVjYWRlCiMgVXNpbmcgZ2dwbG90IHBhY2thZ2UgdG8gcnVuIHRoZSBnZ3Bsb3QoKSBhbmQgZ2VvbV9ib3hwbG90KCkgZnVuY3Rpb24KbHlyaWNzMTk4MHN0bzIwMTBzICU+JQogIGdncGxvdChhZXMoeCA9IGRlY2FkZSwgeSA9IG4sIGZpbGwgPSBkZWNhZGUpKSsKICBnZW9tX2JveHBsb3QoKSsKICBsYWJzKHggPSAiRGVjYWRlIiwgeSA9ICJXb3JkcyBwZXIgU29uZyIsIHRpdGxlID0gIkJveHBsb3RzIG9mIFdvcmRzIHBlciBHcmFtbXkgTm9taW5hdGVkIFNvbmcgYnkgRGVjYWRlIikKIApgYGAKRnJvbSB0aGUgZmlyc3QgZ3JhcGgsIHdlIGNhbiBrbm93IHRoZSB3b3JkcyBwZXIgc29uZyBmb3IgZWFjaCBkZWNhZGUuIEluIDE5ODBzICgxOTgwLTE5ODkpLCB0aGUgbWVkaWFuIG9mIG51bWJlciBvZiB3b3JkcyBwZXIgc29uZyBpcyBhYnV0IDMwMC4gSW4gMTk5MHMgKDE5OTAtMTk5OSksIHRoZSBtZWRpYW4gb2YgbnVtYmVyIG9mIHdvcmRzIHBlciBzb25nIGlzIGFib3V0IDI5MC4gSW4gMjAwMHMgKDIwMDAtMjAwOSksIHRoZSBtZWRpYW4gb2YgbnVtYmVyIG9mIHdvcmRzIHBlciBzb25nIGlzIGFib3V0IDM3NS4gSW4gMjAxMHMgKDIwMTAtMjAxOSksIHRoZSBtZWRpYW4gb2YgbnVtYmVyIG9mIHdvcmRzIHBlciBzb25nIGlzIGFib3V0IDM4MC4gVGhlcmVmb3JlLCBieSBsb29raW5nIGF0IHRoZSBmaXJzdCBncmFwaCwgcGVvcGxlIGNhbiBrbm93IGhvdyB0aGUgd29yZHMgcGVyIHNvbmcgaW4gZWFjaCBkZWNhZGUgY2hhbmdlZCwgYW5kIGl0IGlzIHJlYWxseSBpbnRlcmVzdGluZy4KCiMjIyBHcmFwaCAyCgpgYGB7cn0KIyBjb3VudCB0aGUgd29yZHMgYW5kIHVzZSB0b3BfbigxMCkgdG8ga25vdyB0aGUgdGVuIG1vc3QgcG9wdWxhciB3b3JkcyBvZiBHcmFtbXkgTm9taW5hdGVkIFNvbmdzIGZyb20gMTk4MCAtIDIwMTkgKGV4Y2VwdCBhbGwgdGhlIHN0b3Agd29yZHMpCkdyYXBoMnRvcHRlbiA8LSBmdDEgJT4lCiAgY291bnQod29yZCwgc29ydCA9IFRSVUUpICU+JQogIGZpbHRlcihuID49IDMpICU+JQogICNmaWx0ZXIod29yZCAhPSAnZW0nKSAlPiUgI1JldmlldyB0b3B0ZW4gYW5kIGZpbHRlciB3b3JkcyBtaXNzZWQgYnkgc3RvcF93b3JkcwogIHRvcF9uKDEwKQpHcmFwaDJ0b3B0ZW4KYGBgCgpgYGB7cn0KIyBVc2luZyB0aGUgZGF0YSBpbiBHcmFwaDJ0b3B0ZW4gdG8gZHJhdyB0aGUgZ3JhcGggdGhhdCBzaG93IHRoZSB0ZW4gbW9zdCBwb3B1bGFyIHdvcmRzIG9mIEdyYW1teSBOb21pbmF0ZWQgU29uZ3MgZnJvbSAxOTgwIC0gMjAxOQojIFVzaW5nIGdncGxvdCBwYWNrYWdlIHRvIHJ1biB0aGUgZ2dwbG90KCkgYW5kIGdlb21fY29sKCkgZnVuY3Rpb24KR3JhcGgydG9wdGVuICU+JSAKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKHdvcmQsIC1uKSwgeSA9IG4pKSArCiAgZ2VvbV9jb2woZmlsbCA9ICJwaW5rIikrCiAgbGFicyh5ID0gIkNvdW50IiwgeCA9ICJXb3JkIiwgdGl0bGUgPSAiVGVuIE1vc3QgUG9wdWxhciBXb3JkcyBvZiBHcmFtbXkgTm9taW5hdGVkIFNvbmdzIGZyb20gMTk4MCAtIDIwMTkiICkKCmBgYApGb3IgdGhlIHNlY29uZCBncmFwaCwgd2UgY2FuIGtub3cgdGhlIHRlbiBtb3N0IHBvcHVsYXIgd29yZHMgb2YgR3JhbW15IE5vbWluYXRlZCBTb25ncyBmcm9tIDE5ODAgLSAyMDE5IChleGNlcHQgc3RvcCB3b3JkcykuIEl0IG1lYW5zIHRoYXQgd2UgY2FuIGtub3cgd2hpY2ggd29yZHMgYXJlIHBvcHVsYXIgaW4gR3JhbW15IE5vbWluYXRlZCBTb25ncyBmcm9tIDE5ODAgLSAyMDE5LiBCeSBsb29raW5nIHRoZSBncmFwaCwgd2UgY2FuIGtub3cgdGhhdCB0aGUgd29yZCAibG92ZSIgaXMgdGhlIG1vc3QgcG9wdWxhciB3b3JkcyBvZiBHcmFtbXkgTm9taW5hdGVkIFNvbmdzIGZyb20gMTk4MCAtIDIwMTksIGFuZCBpdCBpcyB1c2VkIG1vcmUgdGhhbiA1MDAgdGltZXMhCgoKIyMjIEdyYXBoIDMKYGBge3J9CiMgRmlsdGVyIG91dCB0aGUgd29yZHMgdGhhdCB1c2VkIGluIHRoZSBseXJpY3MgYmV0d2VlbiAxOTgwIGFuZCAxOTg5IHllYXJzIGFuZCB0aGVuIG1ha2UgYSBuZXcgY29sdW1uIGluIG9yZGVyIHRvIG1ha2UgdGhlIHdvcmRzIHRoYXQgdXNlZCBpbiB0aGUgbHlyaWNzIGJldHdlZW4gMTk4MCBhbmQgMTk4OSB0byAxOTgwcywgYmVjYXVzZSAxOTgwIHRvIDE5ODkgeWVhcnMgYWxsIGJlbG9uZyB0byAxOTgwcyAoZXhjZXB0IHN0b3Agd29yZHMpCiMgVXNpbmcgZHBseXIgcGFja2FnZSB0byBydW4gdGhlIGZpbHRlcigpIGFuZCBtdXRhdGUoKSBmdW5jdGlvbgpuZXdseXJpY3MxOTgwcyA8LQogIGZ0MSAlPiUKICBmaWx0ZXIoWWVhciAlaW4lICgxOTgwOjE5ODkpKSAlPiUKICBtdXRhdGUoZGVjYWRlID0gIjE5ODBzIikKbmV3bHlyaWNzMTk4MHMKYGBgCgpgYGB7cn0KIyBGaWx0ZXIgb3V0IHRoZSB3b3JkcyB0aGF0IHVzZWQgaW4gdGhlIGx5cmljcyBiZXR3ZWVuIDE5OTAgYW5kIDE5OTkgeWVhcnMgYW5kIHRoZW4gbWFrZSBhIG5ldyBjb2x1bW4gaW4gb3JkZXIgdG8gbWFrZSB0aGUgd29yZHMgdGhhdCB1c2VkIGluIHRoZSBseXJpY3MgYmV0d2VlbiAxOTkwIGFuZCAxOTk5IHRvIDE5OTBzLCBiZWNhdXNlIDE5OTAgdG8gMTk5OSB5ZWFycyBhbGwgYmVsb25nIHRvIDE5OTBzIChleGNlcHQgYWxsIHN0b3Agd29yZHMpCiMgVXNpbmcgZHBseXIgcGFja2FnZSB0byBydW4gdGhlIGZpbHRlcigpIGFuZCBtdXRhdGUoKSBmdW5jdGlvbgpuZXdseXJpY3MxOTkwcyA8LQogIGZ0MSAlPiUKICBmaWx0ZXIoWWVhciAlaW4lICgxOTkwOjE5OTkpKSAlPiUKICBtdXRhdGUoZGVjYWRlID0gIjE5OTBzIikKbmV3bHlyaWNzMTk5MHMKYGBgCgpgYGB7cn0KIyBGaWx0ZXIgb3V0IHRoZSB3b3JkcyB0aGF0IHVzZWQgaW4gdGhlIGx5cmljcyBiZXR3ZWVuIDIwMDAgYW5kIDIwMDkgeWVhcnMgYW5kIHRoZW4gbWFrZSBhIG5ldyBjb2x1bW4gaW4gb3JkZXIgdG8gbWFrZSB0aGUgd29yZHMgdGhhdCB1c2VkIGluIHRoZSBseXJpY3MgYmV0d2VlbiAyMDAwIGFuZCAyMDA5IHRvIDIwMDBzLCBiZWNhdXNlIDIwMDAgdG8gMjAwOSB5ZWFycyBhbGwgYmVsb25nIHRvIDIwMDBzIChleGNlcHQgYWxsIHN0b3Agd29yZHMpCiMgVXNpbmcgZHBseXIgcGFja2FnZSB0byBydW4gdGhlIGZpbHRlcigpIGFuZCBtdXRhdGUoKSBmdW5jdGlvbgpuZXdseXJpY3MyMDAwcyA8LQogIGZ0MSAlPiUKICBmaWx0ZXIoWWVhciAlaW4lICgyMDAwOjIwMDkpKSAlPiUKICBtdXRhdGUoZGVjYWRlID0gIjIwMDBzIikKbmV3bHlyaWNzMjAwMHMKYGBgCgpgYGB7cn0KIyBGaWx0ZXIgb3V0IHRoZSB3b3JkcyB0aGF0IHVzZWQgaW4gdGhlIGx5cmljcyBiZXR3ZWVuIDIwMTAgYW5kIDIwMTkgeWVhcnMgYW5kIHRoZW4gbWFrZSBhIG5ldyBjb2x1bW4gaW4gb3JkZXIgdG8gbWFrZSB0aGUgd29yZHMgdGhhdCB1c2VkIGluIHRoZSBseXJpY3MgYmV0d2VlbiAyMDEwIGFuZCAyMDE5IHRvIDIwMTBzLCBiZWNhdXNlIDIwMTAgdG8gMjAxOSB5ZWFycyBhbGwgYmVsb25nIHRvIDIwMTBzIChleGNlcHQgYWxsIHN0b3Agd29yZHMpCiMgVXNpbmcgZHBseXIgcGFja2FnZSB0byBydW4gdGhlIGZpbHRlcigpIGFuZCBtdXRhdGUoKSBmdW5jdGlvbgpuZXdseXJpY3MyMDEwcyA8LQogIGZ0MSAlPiUKICBmaWx0ZXIoWWVhciAlaW4lICgyMDEwOjIwMTkpKSAlPiUKICBtdXRhdGUoZGVjYWRlID0gIjIwMTBzIikKbmV3bHlyaWNzMjAxMHMKYGBgCgpgYGB7cn0KIyBtYWtlIHdvcmRzIGluIGx5cmljcyB0aGF0IGFyZSBpbiAxOTgwcyBhbmQgMTk5MHMgdG9nZXRoZXIgKGV4Y2VwdCBhbGwgc3RvcCB3b3JkcykKIyBVc2luZyBkcGx5ciBwYWNrYWdlIHRvIHJ1biB0aGUgZnVsbF9qb2luKCkgZnVuY3Rpb24KbmV3bHlyaWNzMTk4MHN0bzE5OTBzIDwtCiAgbmV3bHlyaWNzMTk4MHMgJT4lCiAgZnVsbF9qb2luKG5ld2x5cmljczE5OTBzKQpuZXdseXJpY3MxOTgwc3RvMTk5MHMKYGBgCgpgYGB7cn0KIyBtYWtlIHdvcmRzIGluIGx5cmljcyB0aGF0IGFyZSBpbiAxOTgwcywgMTk5MHMgYW5kIDIwMDBzIHRvZ2V0aGVyIChleGNlcHQgYWxsIHN0b3Agd29yZHMpCiMgVXNpbmcgZHBseXIgcGFja2FnZSB0byBydW4gdGhlIGZ1bGxfam9pbigpIGZ1bmN0aW9uCm5ld2x5cmljczE5ODBzdG8yMDAwcyA8LQogIG5ld2x5cmljczE5ODBzdG8xOTkwcyAlPiUKICBmdWxsX2pvaW4obmV3bHlyaWNzMjAwMHMpCm5ld2x5cmljczE5ODBzdG8yMDAwcwpgYGAKCmBgYHtyfQojIG1ha2Ugd29yZHMgaW4gbHlyaWNzIHRoYXQgYXJlIGluIDE5ODBzLCAxOTkwcywgMjAwMHMgYW5kIDIwMTBzIHRvZ2V0aGVyIChleGNlcHQgYWxsIHN0b3Agd29yZHMpCiMgVXNpbmcgZHBseXIgcGFja2FnZSB0byBydW4gdGhlIGZ1bGxfam9pbigpIGZ1bmN0aW9uCm5ld2x5cmljczE5ODBzdG8yMDEwcyA8LQogIG5ld2x5cmljczE5ODBzdG8yMDAwcyAlPiUKICBmdWxsX2pvaW4obmV3bHlyaWNzMjAxMHMpCm5ld2x5cmljczE5ODBzdG8yMDEwcwpgYGAKCmBgYHtyfQojIGtub3cgdGhlIHRvcCAxMCB3b3JkcyB0aGF0IHVzZWQgaW4gMTk4MHMgKGV4Y2VwdCBhbGwgc3RvcCB3b3JkcykKIyBVc2luZyBtb3NhaWMgcGFja2FnZSB0byBydW4gdGhlIGNvdW50KCkgZnVuY3Rpb24KIyBVc2luZyBkcGx5ciBwYWNrYWdlIHRvIHJ1biB0aGUgZmlsdGVyKCkgYW5kIHRvcF9uKCkgZnVuY3Rpb24KR3JhcGgzdG9wdGVuODBzIDwtIG5ld2x5cmljczE5ODBzICU+JQogIGNvdW50KHdvcmQsIHNvcnQgPSBUUlVFKSAlPiUKICBmaWx0ZXIobiA+PSAzKSAlPiUKICAjZmlsdGVyKHdvcmQgIT0gJ2VtJykgJT4lICNSZXZpZXcgdG9wdGVuIGFuZCBmaWx0ZXIgd29yZHMgbWlzc2VkIGJ5IHN0b3Bfd29yZHMKICB0b3BfbigxMCkKR3JhcGgzdG9wdGVuODBzCmBgYAoKYGBge3J9CiMga25vdyB0aGUgdG9wIDEwIHdvcmRzIHRoYXQgdXNlZCBpbiAxOTkwcyAoZXhjZXB0IGFsbCBzdG9wIHdvcmRzKQojIFVzaW5nIG1vc2FpYyBwYWNrYWdlIHRvIHJ1biB0aGUgY291bnQoKSBmdW5jdGlvbgojIFVzaW5nIGRwbHlyIHBhY2thZ2UgdG8gcnVuIHRoZSBmaWx0ZXIoKSBhbmQgdG9wX24oKSBmdW5jdGlvbgpHcmFwaDN0b3B0ZW45MHMgPC0gbmV3bHlyaWNzMTk5MHMgJT4lCiAgY291bnQod29yZCwgc29ydCA9IFRSVUUpICU+JQogIGZpbHRlcihuID49IDMpICU+JQogICNmaWx0ZXIod29yZCAhPSAnZW0nKSAlPiUgI1JldmlldyB0b3B0ZW4gYW5kIGZpbHRlciB3b3JkcyBtaXNzZWQgYnkgc3RvcF93b3JkcwogIHRvcF9uKDEwKQpHcmFwaDN0b3B0ZW45MHMKYGBgCgpgYGB7cn0KIyBrbm93IHRoZSB0b3AgMTAgd29yZHMgdGhhdCB1c2VkIGluIDIwMDBzIChleGNlcHQgYWxsIHN0b3Agd29yZHMpCiMgVXNpbmcgbW9zYWljIHBhY2thZ2UgdG8gcnVuIHRoZSBjb3VudCgpIGZ1bmN0aW9uCiMgVXNpbmcgZHBseXIgcGFja2FnZSB0byBydW4gdGhlIGZpbHRlcigpIGFuZCB0b3BfbigpIGZ1bmN0aW9uCkdyYXBoM3RvcHRlbjAwcyA8LSBuZXdseXJpY3MyMDAwcyAlPiUKICBjb3VudCh3b3JkLCBzb3J0ID0gVFJVRSkgJT4lCiAgZmlsdGVyKG4gPj0gMykgJT4lCiAgI2ZpbHRlcih3b3JkICE9ICdlbScpICU+JSAjUmV2aWV3IHRvcHRlbiBhbmQgZmlsdGVyIHdvcmRzIG1pc3NlZCBieSBzdG9wX3dvcmRzCiAgdG9wX24oMTApCkdyYXBoM3RvcHRlbjAwcwpgYGAKCmBgYHtyfQojIGtub3cgdGhlIHRvcCAxMCB3b3JkcyB0aGF0IHVzZWQgaW4gMjAxMHMgKGV4Y2VwdCBhbGwgc3RvcCB3b3JkcykKIyBVc2luZyBtb3NhaWMgcGFja2FnZSB0byBydW4gdGhlIGNvdW50KCkgZnVuY3Rpb24KIyBVc2luZyBkcGx5ciBwYWNrYWdlIHRvIHJ1biB0aGUgZmlsdGVyKCkgYW5kIHRvcF9uKCkgZnVuY3Rpb24KR3JhcGgzdG9wdGVuMTBzIDwtIG5ld2x5cmljczIwMTBzICU+JQogIGNvdW50KHdvcmQsIHNvcnQgPSBUUlVFKSAlPiUKICBmaWx0ZXIobiA+PSAzKSAlPiUKICAjZmlsdGVyKHdvcmQgIT0gJ2VtJykgJT4lICNSZXZpZXcgdG9wdGVuIGFuZCBmaWx0ZXIgd29yZHMgbWlzc2VkIGJ5IHN0b3Bfd29yZHMKICB0b3BfbigxMCkKR3JhcGgzdG9wdGVuMTBzCmBgYAoKYGBge3J9CiMgZHJhdyBhIGdyYXBoIHRoYXQgY2FuIHNob3cgdGhlIHRvcCAxMCB3b3JkcyBpbiAxOTgwcwojIFVzaW5nIGdncGxvdCBwYWNrYWdlIHRvIHJ1biB0aGUgZ2dwbG90KCkgYW5kIGdlb21fY29sKCkgZnVuY3Rpb24KR3JhcGgzLjEgPC0KICBHcmFwaDN0b3B0ZW44MHMgJT4lIAogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIod29yZCwgLW4pLCB5ID0gbikpICsKICBnZW9tX2NvbChmaWxsID0gIkJsdWUiKSsKICBsYWJzKHkgPSAiQ291bnQiLCB4ID0gIldvcmQiLCB0aXRsZSA9ICIxOTgwcyIgKQogIApgYGAKCmBgYHtyfQojIGRyYXcgYSBncmFwaCB0aGF0IGNhbiBzaG93IHRoZSB0b3AgMTAgd29yZHMgaW4gMTk5MHMKIyBVc2luZyBnZ3Bsb3QgcGFja2FnZSB0byBydW4gdGhlIGdncGxvdCgpIGFuZCBnZW9tX2NvbCgpIGZ1bmN0aW9uCkdyYXBoMy4yIDwtCiAgR3JhcGgzdG9wdGVuOTBzICU+JSAKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKHdvcmQsIC1uKSwgeSA9IG4pKSArCiAgZ2VvbV9jb2woZmlsbCA9ICJwaW5rIikrCiAgbGFicyh5ID0gIkNvdW50IiwgeCA9ICJXb3JkIiwgdGl0bGUgPSAiMTk5MHMiICkKICAKYGBgCgpgYGB7cn0KIyBkcmF3IGEgZ3JhcGggdGhhdCBjYW4gc2hvdyB0aGUgdG9wIDEwIHdvcmRzIGluIDIwMDBzCiMgVXNpbmcgZ2dwbG90IHBhY2thZ2UgdG8gcnVuIHRoZSBnZ3Bsb3QoKSBhbmQgZ2VvbV9jb2woKSBmdW5jdGlvbgpHcmFwaDMuMyA8LQogIEdyYXBoM3RvcHRlbjAwcyAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcih3b3JkLCAtbiksIHkgPSBuKSkgKwogIGdlb21fY29sKGZpbGwgPSAicmVkIikrCiAgbGFicyh5ID0gIkNvdW50IiwgeCA9ICJXb3JkIiwgdGl0bGUgPSAiMjAwMHMiICkKICAKYGBgCgpgYGB7cn0KIyBkcmF3IGEgZ3JhcGggdGhhdCBjYW4gc2hvdyB0aGUgdG9wIDEwIHdvcmRzIGluIDIwMTBzCiMgVXNpbmcgZ2dwbG90IHBhY2thZ2UgdG8gcnVuIHRoZSBnZ3Bsb3QoKSBhbmQgZ2VvbV9jb2woKSBmdW5jdGlvbgpHcmFwaDMuNCA8LQogIEdyYXBoM3RvcHRlbjEwcyAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcih3b3JkLCAtbiksIHkgPSBuKSkgKwogIGdlb21fY29sKGZpbGwgPSAib3JhbmdlIikrCiAgbGFicyh5ID0gIkNvdW50IiwgeCA9ICJXb3JkIiwgdGl0bGUgPSAiMjAxMHMiICkKIApgYGAKCmBgYHtyfQojIENvbWJpbmUgdGhlIDQgZ3JhcGhzIHRoYXQgY3JlYXRlZCBiZWZvcmUsIGFuZCBjb21iaW5lIHRoZW4gdG9nZXRoZXIgYnkgdXNpbmcgZ3JpZC5hcnJhbmdlKCkgZnVuY3Rpb24sIGFuZCB0aGVuIHBlb3BsZSBjYW4ga25vdyB0aGUgdG9wIHRlbiB3b3JkcyBieSBkZWNhZGUgKGV4Y2VwdCBzdG9wIHdvcmRzKQojIFVzaW5nIGdyaWQuRXh0cmEgcGFja2FnZSB0byBydW4gdGhlIGdyaWQuYXJyYW5nZSgpIGZ1bmN0aW9uCkdyYXBoMyA8LQogIGdyaWQuYXJyYW5nZShHcmFwaDMuMSwgR3JhcGgzLjIsIEdyYXBoMy4zLCBHcmFwaDMuNCwgdG9wID0gIlRvcCBUZW4gV29yZHMgYnkgRGVjYWRlIikKYGBgCkZvciB0aGUgdGhpcmQgZ3JhcGgsIHdlIGNhbiBrbm93IHRvcCB0ZW4gd29yZHMgYnkgZGVjYWRlLiBJbiAxOTgwcyAoMTk4MC0xOTg5KSwgd2UgY2FuIGtub3cgdGhlIHdvcmRzICJsb3ZlIiBpcyB0aGUgbW9zdCBwb3B1bGFyIHdvcmRzIGluIHRoZSBHcmFtbXkgTm9taW5hdGVkIFNvbmdzIGZyb20gMTk4MC0xOTg5LCBhbmQgaXQgaGFzIGJlZW4gdXNlZCBtb3JlIHRoYW4gMTUwIHRpbWVzLiBGcm9tIHRoZXNlIGZvdXIgZ3JhcGhzLCBwZW9wbGUgY2FuIGtub3cgdGhhdCB0aGUgd29yZCAibG92ZSIgaXMgdGhlIG1vc3QgcG9wdWxhciB3b3JkcyBpbiBhbGwgNCBkZWNhZGVzIQoKCiMjIyBHcmFwaCA0CmBgYHtyfQojIGNyYXRlIGEgc2FtZSBkYXRhIHRhYmxlIGJ1dCBkaWZmZXJlbnQgbmFtZSwgYmVjYXVzZSBJIGFmZnJhaWQgSSBnb3Qgc29tZXRoaW5nIHJ1biBhbmQgbmVlZCB0byBydW4gdGhlIGNvZGUgZnJvbSB0aGUgYmVnaW5uaW5nCm5ld2x5cmljczE5ODBzdG8yMDEwc2EgPC0KICBuZXdseXJpY3MxOTgwc3RvMjAxMHMKYGBgCgpgYGB7cn0KIyBrbm93IHRoZSBkaWZmZXJlbnQgc2VudGltZW50cyBiYXNlZCBvbiB0aGUgZGlmZmVyZW50IHdvcmRzIGluIHRoZSBseXJpY3MgdGhhdCBpbiAxOTgwcyB0byAyMDEwcwojIFVzaW5nIGRwbHlyIHBhY2thZ2UgdG8gcnVuIHRoZSBpbm5lcl9qb2luKCkgYW5kIG11dGF0ZSgpIGZ1bmN0aW9uCiMgVXNpbmcgbW9zYWljIHBhY2thZ2UgdG8gcnVuIHRoZSBjb3VudCgpIGZ1bmN0aW9uCiMgVXNpbmcgdGlkeXIgcGFja2FnZSB0byBydW4gdGhlIHNwcmVhZCgpIGZ1bmN0aW9uCnNlbnRpbWVudCA8LQogIG5ld2x5cmljczE5ODBzdG8yMDEwc2EgJT4lCiAgaW5uZXJfam9pbihnZXRfc2VudGltZW50cygiYmluZyIpKSAlPiUKICBjb3VudChzZW50aW1lbnQsIHdvcmQpICU+JQogIHNwcmVhZChzZW50aW1lbnQsIG4sIGZpbGwgPSAwKSAlPiUKICBtdXRhdGUocG9sYXJpdHkgPSBwb3NpdGl2ZSAtIG5lZ2F0aXZlKSAKc2VudGltZW50CmBgYAoKCmBgYHtyfQojIGtub3cgdGhlIHRvdGFsIHdvcmRzJyBzZW50aW1lbnRzIGluIGRpZmZlcmVudCB5ZWFyCiMgVXNpbmcgZHBseXIgcGFja2FnZSB0byBydW4gdGhlIG11dGF0ZSgpIGZ1bmN0aW9uCiMgVXNpbmcgbW9zYWljIHBhY2thZ2UgdG8gcnVuIHRoZSBjb3VudCgpIGZ1bmN0aW9uCiMgVXNpbmcgdGlkeXIgcGFja2FnZSB0byBydW4gdGhlIHNwcmVhZCgpIGZ1bmN0aW9uCmJpbmcgPC0gZ2V0X3NlbnRpbWVudHMoImJpbmciKQpseXJpY3NzZW50aW1lbnQgPC0gbmV3bHlyaWNzMTk4MHN0bzIwMTBzYSAlPiUgaW5uZXJfam9pbihiaW5nKSAlPiUgCiAgICAgICAgICAgICAgICAgIGNvdW50KFllYXIsIHNlbnRpbWVudCkgJT4lCiAgICAgICAgICAgICAgICAgIHNwcmVhZChzZW50aW1lbnQsIG4gLCBmaWxsPTApICU+JQogICAgICAgICAgICAgICAgICBtdXRhdGUoc2VudGltZW50ID0gcG9zaXRpdmUgLSBuZWdhdGl2ZSkKbHlyaWNzc2VudGltZW50CmBgYAoKCmBgYHtyfQojIGZpbHRlciBvdXQgYWxsIHRoZSBuZWdhdGl2ZSBzZW50aW1lbnQsIGFuZCB1c2UgcG9zaXRpdmUgc2VudGltZW50CiMgVXNpbmcgZHBseXIgcGFja2FnZSB0byBydW4gdGhlIGZpbHRlcigpIGZ1bmN0aW9uCnBvc2l0aXZlX3NlbnRpIDwtCiAgZ2V0X3NlbnRpbWVudHMoImJpbmciKSAlPiUKICBmaWx0ZXIoc2VudGltZW50ID09ICJwb3NpdGl2ZSIpCnBvc2l0aXZlX3NlbnRpCgojIEtub3cgdGhlIHRvdGFsIHBvc2l0aXZlIHdvcmRzJyBzZW50aW1lbnQgaW4gZGlmZmVyZW50IHllYXIKIyBVc2luZyBkcGx5ciBwYWNrYWdlIHRvIHJ1biB0aGUgc2VtaV9qb2luKCkgZnVuY3Rpb24KIyBVc2luZyBtb3NhaWMgcGFja2FnZSB0byBydW4gdGhlIGNvdW50KCkgZnVuY3Rpb24KbHlyaWNzc2VudGltZW50IDwtCiAgbmV3bHlyaWNzMTk4MHN0bzIwMTBzYSAlPiUKICBzZW1pX2pvaW4ocG9zaXRpdmVfc2VudGkpICU+JQogIGNvdW50KFllYXIsIHNvcnQgPSBUUlVFKQpseXJpY3NzZW50aW1lbnQKYGBgCgpgYGB7cn0KIyBDcmF0ZSBhIG5ldyB0YWJsZSB0aGF0IG9ubHkgaW5jbHVkZSB0aGUgdG90YWwgcG9zaXRpdmUgc2VudGltZW50cyBpbiAxOTgwIHRvIDE5ODkgYW5kIGNyYXRlIGEgbmV3IGNvbHVtbiBjYWxsZWQgZGVjYWRlLCBiZWNhdXNlIHRoZXkgYWxsIGJlbG9uZyB0byAxOTgwcwojIFVzaW5nIGRwbHlyIHBhY2thZ2UgdG8gcnVuIHRoZSBmaWx0ZXIoKSBhbmQgbXV0YXRlKCkgZnVuY3Rpb24Kc2VudGk4MHMgPC0KICBseXJpY3NzZW50aW1lbnQgJT4lCiAgZmlsdGVyKFllYXIgJWluJSAoMTk4MDoxOTg5KSkgJT4lCiAgbXV0YXRlKGRlY2FkZSA9ICIxOTgwcyIpCnNlbnRpODBzCgojIENyYXRlIGEgbmV3IHRhYmxlIHRoYXQgb25seSBpbmNsdWRlIHRoZSB0b3RhbCBwb3NpdGl2ZSBzZW50aW1lbnRzIGluIDE5OTAgdG8gMTk5OSBhbmQgY3JhdGUgYSBuZXcgY29sdW1uIGNhbGxlZCBkZWNhZGUsIGJlY2F1c2UgdGhleSBhbGwgYmVsb25nIHRvIDE5OTBzCiMgVXNpbmcgZHBseXIgcGFja2FnZSB0byBydW4gdGhlIGZpbHRlcigpIGFuZCBtdXRhdGUoKSBmdW5jdGlvbgpzZW50aTkwcyA8LQogIGx5cmljc3NlbnRpbWVudCAlPiUKICBmaWx0ZXIoWWVhciAlaW4lICgxOTkwOjE5OTkpKSAlPiUKICBtdXRhdGUoZGVjYWRlID0gIjE5OTBzIikKc2VudGk5MHMKCiMgQ3JhdGUgYSBuZXcgdGFibGUgdGhhdCBvbmx5IGluY2x1ZGUgdGhlIHRvdGFsIHBvc2l0aXZlIHNlbnRpbWVudHMgaW4gMjAwMCB0byAyMDA5IGFuZCBjcmF0ZSBhIG5ldyBjb2x1bW4gY2FsbGVkIGRlY2FkZSwgYmVjYXVzZSB0aGV5IGFsbCBiZWxvbmcgdG8gMjAwMHMKIyBVc2luZyBkcGx5ciBwYWNrYWdlIHRvIHJ1biB0aGUgZmlsdGVyKCkgYW5kIG11dGF0ZSgpIGZ1bmN0aW9uCnNlbnRpMDBzIDwtCiAgbHlyaWNzc2VudGltZW50ICU+JQogIGZpbHRlcihZZWFyICVpbiUgKDIwMDA6MjAwOSkpICU+JQogIG11dGF0ZShkZWNhZGUgPSAiMjAwMHMiKQpzZW50aTAwcwoKIyBDcmF0ZSBhIG5ldyB0YWJsZSB0aGF0IG9ubHkgaW5jbHVkZSB0aGUgdG90YWwgcG9zaXRpdmUgc2VudGltZW50cyBpbiAyMDEwIHRvIDIwMTkgYW5kIGNyYXRlIGEgbmV3IGNvbHVtbiBjYWxsZWQgZGVjYWRlLCBiZWNhdXNlIHRoZXkgYWxsIGJlbG9uZyB0byAyMDEwcwojIFVzaW5nIGRwbHlyIHBhY2thZ2UgdG8gcnVuIHRoZSBmaWx0ZXIoKSBhbmQgbXV0YXRlKCkgZnVuY3Rpb24Kc2VudGkxMHMgPC0KICBseXJpY3NzZW50aW1lbnQgJT4lCiAgZmlsdGVyKFllYXIgJWluJSAoMjAxMDoyMDE5KSkgJT4lCiAgbXV0YXRlKGRlY2FkZSA9ICIyMDEwcyIpCnNlbnRpMTBzCmBgYAoKYGBge3J9CiMgbWFrZSAxOTgwcyBhbmQgMTk5MHMgdG9nZXRoZXIKIyBVc2luZyBkcGx5ciBwYWNrYWdlIHRvIHJ1biB0aGUgZnVsbF9qb2luKCkgZnVuY3Rpb24Kc2VudGk4MDkwIDwtCiAgc2VudGk4MHMgJT4lCiAgZnVsbF9qb2luKHNlbnRpOTBzKQpzZW50aTgwOTAKCiMgbWFrZSAxOTgwcywgMTk5MHMsIGFuZCAyMDAwcyB0b2dldGhlcgojIFVzaW5nIGRwbHlyIHBhY2thZ2UgdG8gcnVuIHRoZSBmdWxsX2pvaW4oKSBmdW5jdGlvbgpzZW50aTgwOTAwMCA8LQogIHNlbnRpODA5MCAlPiUKICBmdWxsX2pvaW4oc2VudGkwMHMpCnNlbnRpODA5MDAwCgojIG1ha2UgMTk4MHMsIDE5OTBzLCAyMDAwcywgYW5kIDIwMTBzIHRvZ2V0aGVyCiMgVXNpbmcgZHBseXIgcGFja2FnZSB0byBydW4gdGhlIGZ1bGxfam9pbigpIGZ1bmN0aW9uCmx5cmljc3NlbnRpbWVudCA8LQogIHNlbnRpODA5MDAwICU+JQogIGZ1bGxfam9pbihzZW50aTEwcykKbHlyaWNzc2VudGltZW50CmBgYAoKCmBgYHtyfQojIEZpbHRlciBvdXQgdGhlIHdvcmRzIHRoYXQgdXNlZCBpbiB0aGUgbHlyaWNzIGJldHdlZW4gMTk4MCBhbmQgMTk4OSB5ZWFycyBhbmQgdGhlbiBtYWtlIGEgbmV3IGNvbHVtbiBpbiBvcmRlciB0byBtYWtlIHRoZSB3b3JkcyB0aGF0IHVzZWQgaW4gdGhlIGx5cmljcyBiZXR3ZWVuIDE5ODAgYW5kIDE5ODkgdG8gMTk4MHMsIGJlY2F1c2UgMTk4MCB0byAxOTg5IHllYXJzIGFsbCBiZWxvbmcgdG8gMTk4MHMKIyBVc2luZyBkcGx5ciBwYWNrYWdlIHRvIHJ1biB0aGUgZmlsdGVyKCkgYW5kIG11dGF0ZSgpIGZ1bmN0aW9uCm5ld2x5cmljczE5ODBzbmV3IDwtIGZ0MSAlPiUKICBmaWx0ZXIoWWVhciAlaW4lICgxOTgwOjE5ODkpKSAlPiUKICBtdXRhdGUoZGVjYWRlID0gIjE5ODBzIikKbmV3bHlyaWNzMTk4MHNuZXcKCiMgRmlsdGVyIG91dCB0aGUgd29yZHMgdGhhdCB1c2VkIGluIHRoZSBseXJpY3MgYmV0d2VlbiAxOTkwIGFuZCAxOTk5IHllYXJzIGFuZCB0aGVuIG1ha2UgYSBuZXcgY29sdW1uIGluIG9yZGVyIHRvIG1ha2UgdGhlIHdvcmRzIHRoYXQgdXNlZCBpbiB0aGUgbHlyaWNzIGJldHdlZW4gMTk5MCBhbmQgMTk5OSB0byAxOTkwcywgYmVjYXVzZSAxOTgwIHRvIDE5ODkgeWVhcnMgYWxsIGJlbG9uZyB0byAxOTkwcwojIFVzaW5nIGRwbHlyIHBhY2thZ2UgdG8gcnVuIHRoZSBmaWx0ZXIoKSBhbmQgbXV0YXRlKCkgZnVuY3Rpb24KbmV3bHlyaWNzMTk5MHNuZXcgPC0gZnQxICU+JQogIGZpbHRlcihZZWFyICVpbiUgKDE5OTA6MTk5OSkpICU+JQogIG11dGF0ZShkZWNhZGUgPSAiMTk5MHMiKQpuZXdseXJpY3MxOTkwc25ldwoKIyBGaWx0ZXIgb3V0IHRoZSB3b3JkcyB0aGF0IHVzZWQgaW4gdGhlIGx5cmljcyBiZXR3ZWVuIDIwMDAgYW5kIDIwMDkgeWVhcnMgYW5kIHRoZW4gbWFrZSBhIG5ldyBjb2x1bW4gaW4gb3JkZXIgdG8gbWFrZSB0aGUgd29yZHMgdGhhdCB1c2VkIGluIHRoZSBseXJpY3MgYmV0d2VlbiAyMDAwIGFuZCAyMDA5IHRvIDIwMDBzLCBiZWNhdXNlIDE5ODAgdG8gMTk4OSB5ZWFycyBhbGwgYmVsb25nIHRvIDIwMDBzCiMgVXNpbmcgZHBseXIgcGFja2FnZSB0byBydW4gdGhlIGZpbHRlcigpIGFuZCBtdXRhdGUoKSBmdW5jdGlvbgpuZXdseXJpY3MyMDAwc25ldyA8LSBmdDEgJT4lCiAgZmlsdGVyKFllYXIgJWluJSAoMjAwMDoyMDA5KSkgJT4lCiAgbXV0YXRlKGRlY2FkZSA9ICIyMDAwcyIpCm5ld2x5cmljczIwMDBzbmV3CgojIEZpbHRlciBvdXQgdGhlIHdvcmRzIHRoYXQgdXNlZCBpbiB0aGUgbHlyaWNzIGJldHdlZW4gMjAxMCBhbmQgMjAxOSB5ZWFycyBhbmQgdGhlbiBtYWtlIGEgbmV3IGNvbHVtbiBpbiBvcmRlciB0byBtYWtlIHRoZSB3b3JkcyB0aGF0IHVzZWQgaW4gdGhlIGx5cmljcyBiZXR3ZWVuIDIwMDAgYW5kIDIwMTkgdG8gMjAxMHMsIGJlY2F1c2UgMTk4MCB0byAxOTg5IHllYXJzIGFsbCBiZWxvbmcgdG8gMjAxMHMKIyBVc2luZyBkcGx5ciBwYWNrYWdlIHRvIHJ1biB0aGUgZmlsdGVyKCkgYW5kIG11dGF0ZSgpIGZ1bmN0aW9uCm5ld2x5cmljczIwMTBzbmV3IDwtIGZ0MSAlPiUKICBmaWx0ZXIoWWVhciAlaW4lICgyMDEwOjIwMTkpKSAlPiUKICBtdXRhdGUoZGVjYWRlID0gIjIwMTBzIikKbmV3bHlyaWNzMjAxMHNuZXcKCiMgbWFrZSB3b3JkcyBpbiBseXJpY3MgdGhhdCBhcmUgaW4gMTk4MHMgYW5kIDE5OTBzIHRvZ2V0aGVyIChleGNlcHQgYWxsIHN0b3Agd29yZHMpCiMgVXNpbmcgZHBseXIgcGFja2FnZSB0byBydW4gdGhlIGZ1bGxfam9pbigpIGZ1bmN0aW9uCm5ld2x5cmljczgwc3RvOTBzbmV3IDwtIG5ld2x5cmljczE5ODBzbmV3ICU+JQogIGZ1bGxfam9pbihuZXdseXJpY3MxOTkwc25ldykKbmV3bHlyaWNzODBzdG85MHNuZXcKCiMgbWFrZSB3b3JkcyBpbiBseXJpY3MgdGhhdCBhcmUgaW4gMTk4MHMsIDE5OTBzIGFuZCAyMDAwcyB0b2dldGhlciAoZXhjZXB0IGFsbCBzdG9wIHdvcmRzKQojIFVzaW5nIGRwbHlyIHBhY2thZ2UgdG8gcnVuIHRoZSBmdWxsX2pvaW4oKSBmdW5jdGlvbgpuZXdseXJpY3M4MHN0bzAwc25ldyA8LSBuZXdseXJpY3M4MHN0bzkwc25ldyAlPiUKICBmdWxsX2pvaW4obmV3bHlyaWNzMjAwMHNuZXcpCm5ld2x5cmljczgwc3RvMDBzbmV3CgojIG1ha2Ugd29yZHMgaW4gbHlyaWNzIHRoYXQgYXJlIGluIDE5ODBzLCAxOTkwcywgMjAwMHMgYW5kIDIwMTBzIHRvZ2V0aGVyIChleGNlcHQgYWxsIHN0b3Agd29yZHMpCiMgVXNpbmcgZHBseXIgcGFja2FnZSB0byBydW4gdGhlIGZ1bGxfam9pbigpIGZ1bmN0aW9uCm5ld2x5cmljczgwc3RvMTBzbmV3IDwtIG5ld2x5cmljczgwc3RvMDBzbmV3ICU+JQogIGZ1bGxfam9pbihuZXdseXJpY3MyMDEwc25ldykKbmV3bHlyaWNzODBzdG8xMHNuZXcKYGBgCgoKYGBge3J9CiMgam9pbiB0aGUgbGFzdCB0YWJsZSB3aXRoIHRoZSBzZW50aW1lbnQKIyBVc2luZyBkcGx5ciBwYWNrYWdlIHRvIHJ1biB0aGUgZnVsbF9qb2luKCkgZnVuY3Rpb24KZnQxc2VudGltZW50IDwtIG5ld2x5cmljczgwc3RvMTBzbmV3ICU+JQogIGZ1bGxfam9pbihzZW50aW1lbnRzKQpmdDFzZW50aW1lbnQKYGBgCgpgYGB7cn0KIyBtYWtlIHRoZSBzZW50aW1lbnQgdGhhdCBpcyBuZWdhdGl2ZSB0byAwIGFuZCBwb3NpdGl2ZSB0byAxCiMgZGVsZXRlIHRoZSBOQQpmdDFzZW50aW1lbnRfbmV3IDwtCiAgd2l0aGluKGZ0MXNlbnRpbWVudF9uZXcsIHNlbnRpbWVudCA8LSBmYWN0b3Ioc2VudGltZW50LCBsYWJlbHMgPSBjKDAsMSkpKSAlPiUKICBuYS5vbWl0KCkKZnQxc2VudGltZW50X25ldwpgYGAKCmBgYHtyfQojIGZpbHRlciBvdXQgYWxsIHRoZSAwIChuZWdhdGl2ZSBzZW50aW1lbnQpLCBhbmQgdXNlIGFsbCB0aGUgMSAocG9zaXRpdmUgc2VudGltZW50KQojIFVzaW5nIGRwbHlyIHBhY2thZ2UgdG8gcnVuIHRoZSBmaWx0ZXIoKSBmdW5jdGlvbgpmdDFzZW50aW1lbnRfbmV3X25ldCA8LQogIGZ0MXNlbnRpbWVudF9uZXcgJT4lCiAgZmlsdGVyKHNlbnRpbWVudCA9PSAiMSIpCmZ0MXNlbnRpbWVudF9uZXdfbmV0CmBgYAoKYGBge3J9CiMgRHJhdyBhIGdyYXBoIHRoYXQgc2hvd3MgTmV0IFNlbnRpbWVudCBTY29yZSBieSBZZWFyCiMgVXNpbmcgZ2dwbG90IHBhY2thZ2UgdG8gcnVuIHRoZSBnZ3Bsb3QoKSwgZ2VvbV9iYXIoKSBhbmQgdGhlbWUoKSBmdW5jdGlvbgpnZ3Bsb3QoZnQxc2VudGltZW50X25ld19uZXQpICsKICBhZXMoeCA9IFllYXIsIGZpbGwgPSBkZWNhZGUpICsKICBnZW9tX2JhcigpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTmV0IFNlbnRpbWVudCIsIHRpdGxlID0gIk5ldCBTZW50aW1lbnQgU2NvcmUgYnkgWWVhciIpICsgCiAgdGhlbWUoYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMzApKQpgYGAKRnJvbSBmb3VydGggZ3JhcGgsIHdlIGNhbiBrbm93IHRoZSBuZXQgc2VudGltZW50IHNjb3JlIGJ5IHllYXIuIEJ5IGxvb2tpbmcgdGhlIGdyYXBoLCB3ZSBjYW4ga25vdyB0aGF0IGJldHdlZW4gMTk4MCBhbmQgMjAxOSwgbHlyaWNzIGluIDIwMTYgaGFzIHRoZSBoaWdoZXN0IG5ldCBzZW50aW1lbnQgc2NvcmUsIGFuZCB0aGUgbmV0IHNlbnRpbWVudCBzY29yZSBpcyBtb3JlIHRoYW4gMTAwLCBhbmQgbHlyaWNzIGluIDIwMTEgaGFzIHRoZSBsb3dlc3QgbmV0IHNlbnRpbWVudCBzY29yZSwgYW5kIHRoZSBuZXQgc2VudGltZW50IHNjb3JlIGlzIG5lYXJseSA1LgoKIyMjIEdyYXBoIDUKYGBge3J9CiMgY2FsY3VsYXRlIHRoZSBtZWFuIG9mIHRoZSBzZW50aW1lbnQgaW4gMTk4MHMKIyBVc2luZyBtb3NhaWMgcGFja2FnZSB0byBydW4gdGhlIG1lYW4oKSBmdW5jdGlvbgptZWFuKHNlbnRpODBzJG4pCmBgYApgYGB7cn0KIyBjYWxjdWxhdGUgdGhlIG1lYW4gb2YgdGhlIHNlbnRpbWVudCBpbiAxOTkwcwojIFVzaW5nIG1vc2FpYyBwYWNrYWdlIHRvIHJ1biB0aGUgbWVhbigpIGZ1bmN0aW9uCm1lYW4oc2VudGk5MHMkbikKYGBgCmBgYHtyfQojIGNhbGN1bGF0ZSB0aGUgbWVhbiBvZiB0aGUgc2VudGltZW50IGluIDIwMDBzCiMgVXNpbmcgbW9zYWljIHBhY2thZ2UgdG8gcnVuIHRoZSBtZWFuKCkgZnVuY3Rpb24KbWVhbihzZW50aTAwcyRuKQpgYGAKYGBge3J9CiMgY2FsY3VsYXRlIHRoZSBtZWFuIG9mIHRoZSBzZW50aW1lbnQgaW4gMjAxMHMKIyBVc2luZyBtb3NhaWMgcGFja2FnZSB0byBydW4gdGhlIG1lYW4oKSBmdW5jdGlvbgptZWFuKHNlbnRpMTBzJG4pCmBgYAoKYGBge3J9CiMgY3JlYXRlIGEgbmV3IGRhdGEgZnJhbWUgdGhhdCBpbmNsdWRlIHRoZSBtZWFuIG9mIHRoZSBzZW50aW1lbnQgaW4gZGlmZmVyZW50IGRlY2FkZQpNZWFuc2VudGkgPC0KICBkYXRhLmZyYW1lIChmaXJzdF9jb2x1bW4gPSBjKCIxOTgwcyIsICIxOTkwcyIsICIyMDAwcyIsICIyMDEwcyIpICxzZWNvbmRfY29sdW1uID0gYygiNDkuMSIsICIzNSIsICIzNC4xIiwgIjQxLjUiKSkKbmFtZXMoTWVhbnNlbnRpKSA8LSBjKCJkZWNhZGUiLCJtZWFuIikKTWVhbnNlbnRpCmBgYAoKYGBge3J9CiMgRHJhdyBhIGdyYXBoIHRoYXQgY2FuIHNob3cgdGhlIE1lYW4gU2VudGltZW50IFNjb3JlIGJ5IERlY2FkZQojIFVzaW5nIGdncGxvdCBwYWNrYWdlIHRvIHJ1biB0aGUgZ2dwbG90KCksIGdlb21fY29sKCkgZnVuY3Rpb24KZ2dwbG90KE1lYW5zZW50aSwgYWVzKGRlY2FkZSwgbWVhbiwgZmlsbCA9IGRlY2FkZSkpICsKICBnZW9tX2NvbCgpICsKICBsYWJzKHkgPSAiTWVhbiBTZW50aW1lbnQgU2NvcmUiLCB4ID0gIkRlY2FkZSIsIHRpdGxlID0gIk1lYW4gU2VudGltZW50IFNjb3JlIGJ5IERlY2FkZSIgKSAKYGBgCkZyb20gdGhlIGZpZnRoIGdyYXBoLCB3ZSBjYW4ga25vdyB0aGUgbWVhbiBzZW50aW1lbnQgc2NvcmUgYnkgZGVjYWRlLiBCeSBsb29raW5nIHRoZSBncmFwaCwgd2UgY2FuIGtub3cgdGhhdCBiZXR3ZWVuIDE5ODBzIGFuZCAyMDEwcywgdGhlIGx5cmljcyBpbiAxOTgwcyBoYXMgdGhlIGhpZ2hlc3QgbWVhbiBzZW50aW1lbnQgc2NvcmUsIGFuZCB0aGUgbHlyaWNzIGluIDIwMDBzIGhhcyB0aGUgbG93ZXN0IG1lYW4gc2VudGltZW50IHNjb3JlLCB0aGVpciBkaWZmZXJlbmNlIGFyZSByZWFsbHkgYmlnLCBhbmQgYWJvdXQgMTUuCgoKIyMjIEdyYXBoIDYKYGBge3J9CnBsb3QobHlyaWNzc2VudGltZW50JFllYXIsIGx5cmljc3NlbnRpbWVudCRuLCBtYWluID0gIk5ldCBTZW50aW1lbnQgU2NvcmUgYnkgWWVhciBvZiBHcmFtbXkgTm9taW5hdGVkIFJlY29yZHMgZnJvbSAxOTgwIC0gMjAxOSB3aXRoIExpbmVhciBNb2RlbCBGaXQiLCB5bGFiID0gIk5ldCBTZW50aW1lbnQiLCB4bGFiID0gIlllYXIiKQpgYGAKCgpgYGB7cn0KIyBkcmF3IGEgZ3JhcGggdGhhdCBjYW4gc2hvdyBOZXQgU2VudGltZW50IFNjb3JlIGJ5IFllYXIgb2YgR3JhbW15IE5vbWluYXRlZCBSZWNvcmRzIGZyb20gMTk4MCAtIDIwMTkgd2l0aCBMaW5lYXIgTW9kZWwgRml0CiMgVXNpbmcgZ2dwbG90IHBhY2thZ2UgdG8gcnVuIHRoZSBnZ3Bsb3QoKSwgZ2d0aXRsZSgpLCBnZW9tX3Ntb290aCgpLCB4bGFiKCkgYW5kIHlsYWIoKSBmdW5jdGlvbgpnZ3Bsb3QobHlyaWNzc2VudGltZW50LCBhZXMoeCA9IFllYXIsIHkgPSBuLCBjb2xvciA9IGRlY2FkZSkpICsgZ2VvbV9wb2ludCgpICsgZ2VvbV9zbW9vdGgoKSArCiAgZ2d0aXRsZSgiTmV0IFNlbnRpbWVudCBTY29yZSBieSBZZWFyIG9mIEdyYW1teSBOb21pbmF0ZWQgUmVjb3JkcyBmcm9tIDE5ODAgLSAyMDE5IHdpdGggTGluZWFyIE1vZGVsIEZpdCIpICsKICB4bGFiKCJZZWFyIikgKwogIHlsYWIoIk5ldCBTZW50aW1lbnQiKSArCiAgZ2VvbV9zbW9vdGgoYWVzKHggPSBZZWFyLCB5ID0gbiksIG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UsIGluaGVyaXQuYWVzID0gRkFMU0UsIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKSAKYGBgCgpGcm9tIHRoZSBzaXh0aCBncmFwaCwgd2UgY2FuIGtub3cgdGhlIG5ldCBzZW50aW1lbnQgc2NvcmUgYnkgeWVhciBvZiBHcmFtbXkgTm9taW5hdGVkIFJlY29yZHMgZnJvbSAxOTgwIC0gMjAxOS4gQnkgbG9va2luZyB0aGUgZ3JhcGgsIHdlIGNhbiBlYXNpbHkgdG8ga25vdyBob3cgdGhlIG5ldCBzZW50aW1lbnQgY2hhbmdlIGluIGRpZmZlcmVudCB5ZWFycywgYW5kIGJ5IGxvb2tpbmcgdGhlIGZpdCBsaW5lLCB3ZSBjYW4ga25vdyB0aGF0IHRoZSBuZXQgc2VudGltZW50IGhhcyBiZWNvbWUgaGlnaGVyIGZyb20gMjAxMHMuCgoKCgo=